package br.com.bankai.koby.presentation.controller;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import br.com.bankai.koby.repository.dom.DomPessoa.DomTipoEndereco;
import br.com.bankai.koby.repository.entity.Contato;
import br.com.bankai.koby.repository.entity.Endereco;
import br.com.bankai.koby.repository.entity.PessoaJuridica;
import br.com.bankai.koby.repository.entity.simple.PessoaJuridicaSimple;
import br.com.bankai.koby.service.exception.AlreadyExistsException;
import br.com.bankai.koby.service.exception.NoResultFoundException;
import br.com.bankai.koby.service.impl.PessoaJuridicaService;
import br.com.graflogic.utilities.datautil.copy.ObjectCopier;

/**
 * 
 * @author Leonardo
 *
 */
@Controller
@Scope("view")
public class PessoaJuridicaController extends PessoaBaseController<PessoaJuridica, PessoaJuridicaSimple> {

	private static final long serialVersionUID = 6004494288179903353L;

	private static final String VIEW_ESTABELECIMENTO = "cadastro/estabelecimento";

	@Autowired
	private PessoaJuridicaService service;

	private Contato contato;

	@Override
	public void afterPropertiesSet() throws Exception {
		try {
			super.afterPropertiesSet();

			if (isView(VIEW_ESTABELECIMENTO)) {
				
				
			} else {
				throw new RuntimeException("View desconhecida " + getActualView());
			}

			contato = new Contato();
		} catch (Throwable t) {
			returnFatalMessage("Erro ao iniciar a tela, contate o administrador", null, t);
		}
	}

	@Override
	protected boolean executeSave() {
		beforeSave(getEntity());

		if (isView(VIEW_ESTABELECIMENTO)) {
			
		}
service.save(getEntity());
		if (isEditing()) {
			returnInfoMessage("Cadastro alterado com sucesso", null);
		} else {
			returnInfoMessage("Cadastro inserido com sucesso", null);
		}

		return true;
	}

	@Override
	protected void beforeAdd() {
		if (isView(VIEW_ESTABELECIMENTO)) {
//			setEntity(new Estabelecimento());
//			setFilterEntity(new EstabelecimentoSimple());
//			((Estabelecimento) getEntity()).setMatriz(new EstabelecimentoSimple());
		}

		getEntity().getEnderecos().add(new Endereco(DomTipoEndereco.COMERCIAL));
		getEntity().getEnderecos().add(new Endereco(DomTipoEndereco.CORRESPONDENCIA));
	}

	@Override
	protected void executeEdit(PessoaJuridicaSimple selectedEntity) throws Exception {
//		setEntity(service.find(new PessoaJuridica(selectedEntity.getId(), null, getFilterEntity().getTipo())));

		if (isView(VIEW_ESTABELECIMENTO)) {
//			if (null == ((Estabelecimento) getEntity()).getMatriz()) {
//				((Estabelecimento) getEntity()).setMatriz(new EstabelecimentoSimple());
//			}
		}
	}

	@Override
	protected void executeSearch() {
//		setEntities(service.search(getFilterEntity()));
	}

	// Utilidade
	public void findMatriz() {
//		try {
//			String cnpjMatriz = ((Estabelecimento) getEntity()).getMatriz().getCnpj();
//
//			((Estabelecimento) getEntity()).setMatriz(new EstabelecimentoSimple());
//
//			if (StringUtils.isNotEmpty(cnpjMatriz)) {
//				if (cnpjMatriz.equals(getEntity().getCnpj())) {
//					returnWarnMessage("O CNPJ da matriz deve ser diferente do cadastrado", null, null);
//					return;
//				}
//
//				try {
//					EstabelecimentoSimple matriz = (EstabelecimentoSimple) service.find(new EstabelecimentoSimple(null, cnpjMatriz));
//
//					((Estabelecimento) getEntity()).setMatriz((EstabelecimentoSimple) ObjectCopier.copy(matriz));
//				} catch (NoResultFoundException e) {
//					returnWarnMessage("Matriz não encontrada", null, null);
//				}
//			}
//		} catch (Throwable t) {
//			returnFatalMessage("Erro ao consultar a matriz, contate o administrador", null, t);
//		}
	}

	public void changeCepComercial() {
		Endereco retorno = findCep(getEntity().getEnderecoComercial().getCep());

		getEntity().getEnderecoComercial().setBairro(retorno.getBairro());
		getEntity().getEnderecoComercial().setCidade(retorno.getCidade());
		getEntity().getEnderecoComercial().setEstado(retorno.getEstado());
		getEntity().getEnderecoComercial().setLogradouro(retorno.getLogradouro());
		getEntity().getEnderecoComercial().setComplemento(null);
		getEntity().getEnderecoComercial().setNumero(null);
	}

	public void changeCepCorrespondencia() {
		Endereco retorno = findCep(getEntity().getEnderecoCorrespondencia().getCep());

		getEntity().getEnderecoCorrespondencia().setBairro(retorno.getBairro());
		getEntity().getEnderecoCorrespondencia().setCidade(retorno.getCidade());
		getEntity().getEnderecoCorrespondencia().setEstado(retorno.getEstado());
		getEntity().getEnderecoCorrespondencia().setLogradouro(retorno.getLogradouro());
		getEntity().getEnderecoCorrespondencia().setComplemento(null);
		getEntity().getEnderecoCorrespondencia().setNumero(null);
	}

	public void resetEnderecoCorrespondencia() {
		getEntity().setEndereco(new Endereco(DomTipoEndereco.CORRESPONDENCIA));
	}

	@Override
	protected void executeEditRelated(Object relatedEntity) throws Exception {
		if (relatedEntity instanceof Contato) {
			contato = (Contato) ObjectCopier.copy(relatedEntity);
		}
	}

	// Getters e Setters
	public Contato getContato() {
		return contato;
	}
}